package com.example.helloword  // 确保包名和项目一致

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class GameActivity : AppCompatActivity() {
    // 1. 控件集合：卡片容器、背面图片、正面数字
    private val cardContainers = mutableListOf<FrameLayout>()  // 12个卡片容器
    private val cardBacks = mutableListOf<ImageView>()         // 12个背面图片
    private val cardFronts = mutableListOf<TextView>()         // 12个正面数字
    private lateinit var tvScore: TextView

    // 2. 游戏数据：得分、已翻卡片、是否可点击（避免连续点击）
    private var score = 0
    private var firstCard: FrameLayout? = null  // 第一次点击的卡片
    private var secondCard: FrameLayout? = null // 第二次点击的卡片
    private var isClickable = true              // 控制点击开关

    // 3. 数字数组：6对数字（1-6各2个），后续随机打乱
    private val cardNumbers = mutableListOf(1,1,2,2,3,3,4,4,5,5,6,6)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)

        // 初始化控件
        initViews()
        // 随机分配数字给卡片
        randomizeCardNumbers()
        // 设置卡片点击事件
        setCardClickListeners()
        // 设置功能按钮事件
        setFunctionButtons()
    }

    // 初始化所有控件
    private fun initViews() {
        tvScore = findViewById(R.id.tvScore)

        // 添加12个卡片容器、背面图片、正面数字到集合
        cardContainers.add(findViewById(R.id.card1))
        cardContainers.add(findViewById(R.id.card2))
        cardContainers.add(findViewById(R.id.card3))
        cardContainers.add(findViewById(R.id.card4))
        cardContainers.add(findViewById(R.id.card5))
        cardContainers.add(findViewById(R.id.card6))
        cardContainers.add(findViewById(R.id.card7))
        cardContainers.add(findViewById(R.id.card8))
        cardContainers.add(findViewById(R.id.card9))
        cardContainers.add(findViewById(R.id.card10))
        cardContainers.add(findViewById(R.id.card11))
        cardContainers.add(findViewById(R.id.card12))

        cardBacks.add(findViewById(R.id.imgBack1))
        cardBacks.add(findViewById(R.id.imgBack2))
        cardBacks.add(findViewById(R.id.imgBack3))
        cardBacks.add(findViewById(R.id.imgBack4))
        cardBacks.add(findViewById(R.id.imgBack5))
        cardBacks.add(findViewById(R.id.imgBack6))
        cardBacks.add(findViewById(R.id.imgBack7))
        cardBacks.add(findViewById(R.id.imgBack8))
        cardBacks.add(findViewById(R.id.imgBack9))
        cardBacks.add(findViewById(R.id.imgBack10))
        cardBacks.add(findViewById(R.id.imgBack11))
        cardBacks.add(findViewById(R.id.imgBack12))

        cardFronts.add(findViewById(R.id.tvFront1))
        cardFronts.add(findViewById(R.id.tvFront2))
        cardFronts.add(findViewById(R.id.tvFront3))
        cardFronts.add(findViewById(R.id.tvFront4))
        cardFronts.add(findViewById(R.id.tvFront5))
        cardFronts.add(findViewById(R.id.tvFront6))
        cardFronts.add(findViewById(R.id.tvFront7))
        cardFronts.add(findViewById(R.id.tvFront8))
        cardFronts.add(findViewById(R.id.tvFront9))
        cardFronts.add(findViewById(R.id.tvFront10))
        cardFronts.add(findViewById(R.id.tvFront11))
        cardFronts.add(findViewById(R.id.tvFront12))
    }

    // 随机打乱数字，分配给每个卡片的正面
    private fun randomizeCardNumbers() {
        cardNumbers.shuffle()  // 打乱数字顺序
        cardFronts.forEachIndexed { index, textView ->
            textView.text = cardNumbers[index].toString()  // 给正面数字赋值
        }
    }

    // 设置卡片点击事件（翻牌+匹配判断）
    private fun setCardClickListeners() {
        cardContainers.forEach { card ->
            card.setOnClickListener {
                // 防止：连续点击、点击已翻开的卡片、点击已匹配的卡片
                if (!isClickable || card == firstCard || isCardMatched(card)) {
                    return@setOnClickListener
                }

                // 翻牌：隐藏背面图片，显示正面数字
                flipCard(card, true)

                // 判断是第一次还是第二次点击
                if (firstCard == null) {
                    // 第一次点击：记录卡片
                    firstCard = card
                } else {
                    // 第二次点击：记录卡片，关闭点击开关（避免连续点击）
                    secondCard = card
                    isClickable = false

                    // 判断两张卡片数字是否匹配
                    if (isNumbersMatched()) {
                        // 匹配成功：加分，标记卡片为已匹配，重置记录
                        score += 10
                        tvScore.text = "得分：$score"
                        markCardsAsMatched()
                        resetCardRecords()
                        isClickable = true  // 恢复点击
                    } else {
                        // 匹配失败：延迟0.5秒翻回背面，重置记录
                        Handler(Looper.getMainLooper()).postDelayed({
                            flipCard(firstCard!!, false)
                            flipCard(secondCard!!, false)
                            resetCardRecords()
                            isClickable = true  // 恢复点击
                        }, 500)  // 0.5秒延迟，让用户看清数字
                    }
                }
            }
        }
    }

    // 翻牌操作：isShowFront=true（显示正面），false（显示背面）
    private fun flipCard(card: FrameLayout, isShowFront: Boolean) {
        val cardIndex = cardContainers.indexOf(card)  // 获取卡片索引
        if (isShowFront) {
            cardBacks[cardIndex].visibility = View.GONE    // 隐藏背面
            cardFronts[cardIndex].visibility = View.VISIBLE // 显示正面
        } else {
            cardBacks[cardIndex].visibility = View.VISIBLE // 显示背面
            cardFronts[cardIndex].visibility = View.GONE    // 隐藏正面
        }
    }

    // 判断两张卡片数字是否匹配
    private fun isNumbersMatched(): Boolean {
        val firstIndex = cardContainers.indexOf(firstCard)
        val secondIndex = cardContainers.indexOf(secondCard)
        return cardNumbers[firstIndex] == cardNumbers[secondIndex]
    }

    // 标记卡片为已匹配（设置为不可点击）
    private fun markCardsAsMatched() {
        firstCard?.isClickable = false
        secondCard?.isClickable = false
    }

    // 重置已点击卡片的记录
    private fun resetCardRecords() {
        firstCard = null
        secondCard = null
    }

    // 判断卡片是否已匹配（通过是否可点击判断）
    private fun isCardMatched(card: FrameLayout): Boolean {
        return !card.isClickable
    }

    // 设置重新开始、退出按钮事件
    private fun setFunctionButtons() {
        // 重新开始：重置得分、卡片状态、重新分配数字
        findViewById<android.widget.Button>(R.id.btnRestart).setOnClickListener {
            score = 0
            tvScore.text = "得分：$score"
            isClickable = true
            resetCardRecords()

            // 所有卡片翻回背面，恢复可点击
            cardContainers.forEachIndexed { index, card ->
                card.isClickable = true
                cardBacks[index].visibility = View.VISIBLE
                cardFronts[index].visibility = View.GONE
            }

            // 重新随机分配数字
            randomizeCardNumbers()
        }

        // 退出游戏：关闭当前页面
        findViewById<android.widget.Button>(R.id.btnExit).setOnClickListener {
            finish()
        }
    }
}